package com.xykj.sdkdemo

import android.content.Intent
import androidx.recyclerview.widget.GridLayoutManager
import cn.chw.SDK.Entity.VEIdsPara
import cn.chw.SDK.Entity.VEUserType
import cn.chw.SDK.VEngineSDK
import cn.chw.SDK.callback.VEngine_CallBack
import com.blankj.utilcode.util.GsonUtils
import com.blankj.utilcode.util.LogUtils
import com.blankj.utilcode.util.ResourceUtils
import com.blankj.utilcode.util.ToastUtils
import com.google.gson.reflect.TypeToken
import com.jhx.library.app.AppActivity
import com.jhx.library.setOnSingleClickListener
import com.jhx.library.util.SuperUtil
import com.xykj.sdkdemo.databinding.ActivityMainBinding

class MainActivity : AppActivity<ActivityMainBinding>(), VEngine_CallBack {

    override fun getViewBinding() = ActivityMainBinding.inflate(layoutInflater)

    var meetingId = "meetingId"

    var userId: String? = ""

    var promoter = false

    val adapter by lazy {
        EventAdapter()
    }

    override fun initView() {
        VEngineSDK.GetInstance().VEngine_SetCallBack(this) //设置注册回调
        //初始化
        VEngineSDK.GetInstance().VEngine_Init(
            "0.0.0.0", 7000, 4,
            getLogPath(), true, false
        )

        binding.run {

            btLogin.setOnClickListener {
                if (SuperUtil.isEmptyText(etAccount))
                    return@setOnClickListener
                userId = binding.etAccount.text.toString()
                //注册账户
                VEngineSDK.GetInstance().VEngine_Regist( //"120.48.15.136"
                    etIp.text.toString(), 65432, 60000,
                    userId,
                    "123456", VEUserType.Moblie3g, 30, this@MainActivity
                )

            }

            btOut.setOnClickListener {
                VEngineSDK.GetInstance().VEngine_UnRegist()
            }

            recyclerView.layoutManager = GridLayoutManager(this@MainActivity, 4)
            recyclerView.adapter = adapter
            adapter.setNewInstance(GsonUtils.fromJson(
                ResourceUtils.readAssets2String("item_main.json"),
                object : TypeToken<List<String>>() {}.getType()))

            adapter.setOnItemClickListener { adapter, view, position ->
                if (userId.equals(""))
                    return@setOnItemClickListener
                when (position) {
                    0 -> {
                        promoter = true
                        val b = VEngineSDK.GetInstance().VEngine_CreateConf(meetingId)
                        LogUtils.e("创建会议$b")
                    }
                    1 -> {
                        LogUtils.e(
                            VEngineSDK.GetInstance().VEngine_CheckSessionIsRunning(meetingId)
                        )
                        if (VEngineSDK.GetInstance().VEngine_CheckSessionIsRunning(meetingId)) {
                            promoter = false
                            VEngineSDK.GetInstance().VEngine_ConfAddMember_Async(
                                meetingId, userId
                            )
                        } else {
                            ToastUtils.showShort("会议不存在")
                        }
                    }
                }
            }
        }

    }

    override fun onDestroy() {
        VEngineSDK.GetInstance().VEngine_Destroy()
        super.onDestroy()
    }

    override fun notifyRegState(state: Boolean, code: Int, content: String) {
        LogUtils.i("notifyRegState-state:$state code:$code content:$content")
        binding.tvStatu.text = content
    }

    /**
     * 新来电
     *
     *
     * callId：新呼叫ID
     * number：来电号码（不要使用来电号码作为呼叫类型判断）
     * 来电号码，详细规则如下：
     * （1）临时对讲，格式：*9* + 对讲组号 + ~ + 创建者号码
     * （2）会议呼叫，格式：会议号 + ~ + 创建者号码
     * （3）视频监控，格式：*7* + xyz
     * x表示摄像头设备，1=前置摄像头 2=后置摄像头
     * y 保留，可以忽略
     * z 表示接听的方式，1=自动接听，2=手动接听
     * 说明：此类呼叫，需根据参数类型，提前设置视频摄像头（通过调用VEngine_SetDefaultVideoCaptureDevice接口），然后根据接听方式，弹出是否接听选择界面（z=2）或直接调用VEngine_Answer（z=1）。
     * （4）普通呼叫，格式：号码
     * state：状态（查看呼叫状态枚举VECallState）
     * isVideo：是否视频来电
     * idsPara: 呼叫携带参数，VEIdsPara 类中属性type标识呼叫类型。（此属性用来做呼叫类型判断）
     * type说明如下(查看VESessionType)：
     * 1或者12 ： 单呼
     * 4：			广播
     * 5：			临时会议
     * 9：			对讲
     * 13：		临时对讲
     * 14：		监控
     * 15：		MCU会议
     * 16：		紧急呼叫（SOS呼叫）
     * 19：		视频回传
     * 注意：为了防止漏接呼叫，除了以上类型，如果有其他类型的呼叫，都作为单呼处理即可。
     */
    override fun notifyIncomingCall(
        callId: Int,
        number: String,
        state: Int,
        isVideo: Boolean,
        veIdsPara: VEIdsPara
    ) {
        LogUtils.e("呼叫来电-callId:" + callId + "  number:" + number + " state:" + state + " isVideo:" + isVideo + "  name: " + veIdsPara.name)
        val intent = Intent(this@MainActivity, CallingActivity::class.java)
        intent.putExtra("callId", callId)
        intent.putExtra("sessionId", veIdsPara.session)
        intent.putExtra("mIsCalling", promoter)
        startActivity(intent)
    }

    /**
     * 呼叫状态回调
     *
     * @param callId 呼叫ID
     * @param number 对端号码
     * @param state  呼叫状态（查看呼叫状态枚举）
     * 1外呼2新来电3早期媒体流4连接中5连接确认6断开连接
     */
    override fun notifyCallState(callId: Int, number: String, state: Int) {
        LogUtils.i("呼叫状态callId:$callId  number:$number state:$state")
    }

    /**
     * 短消息发送结果
     *
     * @param state  短消息状态，200或203则成功
     * @param reason 失败原因描述
     */
    override fun notifySendMsgState(state: Int, reason: String) {
        LogUtils.i("发送消息state:$state  reason:$reason")
    }

    override fun notifyReceiveMsg(from: String, msgType: String, msg: String) {
        LogUtils.i("接收消息from:$from  msgType:$msgType  msg:$msg")
    }


    /**
     * 日志回调
     *
     * @param level 日志等级
     * @param log   日志内容
     */
    override fun notifyLogWriter(level: Int, log: String?) {}

    override fun notifyPocSpeaker(groupNumber: String, speaker: String, online_count: String) {
        LogUtils.v("对讲组状态推送notifyPocSpeaker-groupNumber:$groupNumber  speaker:$speaker  online_count = $online_count")
    }

    override fun notifyPocWaiting(nspeaker: String, queue: String) {
        LogUtils.i("对讲组申请话权排队回调notifyPocWaiting-nspeaker:$nspeaker  queue:$queue")
    }

    /**
     * 对讲申请话权拒绝回调
     *
     * @param error 错误码
     */
    override fun notifyPocReject(error: String) {
        LogUtils.e("对讲申请话权拒绝回调notifyPocReject-error:$error")
    }

    /**
     * 默认对讲组更改通知
     *
     * @param groupNo 切换成功之后的默认对讲组
     */
    override fun notifyDefaultPocGroup(groupNo: String) {
        LogUtils.w("定位默认对讲组更改通知notifyDefaultPocGroup-groupNo:$groupNo")
    }

    /**
     * 临时对讲状态通知
     *
     * @param sessionId 会话id
     * @param grpNo     组号
     * @param state     临时对讲呼叫状态VECallState
     * @param groupType 固定对讲:9  临时对讲:13
     */
    override fun notifyTempIntercomState(
        sessionId: String,
        grpNo: String,
        state: Int,
        groupType: Int
    ) {
        LogUtils.i("定位对讲组状态临时对讲sessionId:$sessionId  grpNo:$grpNo  状态:$state  groupType:$groupType")
    }

    /**
     * 注册成员状态变更
     *
     * @param number 成员号码
     * @param state  注册状态（1：在线，2：离线）
     */
    override fun notifyMemberRegStateChange(number: String, state: Int) {
        LogUtils.i("notifyMemberRegStateChange:$number  state:$state")
    }

    override fun notifyError(s: String, s1: String, s2: String) {
        LogUtils.e("notifyErrors:$s  s1:$s1  s2:$s2")
    }

    /**
     * 会议创建成功回调
     *
     * @param sessionId           会话id
     * @param callId              呼叫id
     * @param bVideo              是否是视频会议
     * @param sessionType         会议类型
     * @param meetingCreateNumber 会议创建者
     * @param meetingName         会议名称
     */
    override fun notifyConfCreatedInfo(
        sessionId: String,
        callId: Int,
        bVideo: Boolean,
        sessionType: Int,
        meetingCreateNumber: String,
        meetingName: String
    ) {
        LogUtils.e("会议创建成功回调-sessionId:$sessionId  callId:$callId 是否是视频:$bVideo  meetingCreateNumber:$meetingCreateNumber  meetingName:$meetingName")
    }

    /**
     * 异步推送事件（总事件）
     *
     * @param header  消息头
     * @param content 消息内容
     */
    override fun notifyReceivePublishMsg(header: String?, content: String?) {}

    /**
     * 呼叫成员状态变更
     *
     * @param content [{"cid":"4A2BE08A-0CF6-493A-9010-77176B6973B6","employeeid":"1006","name":"1006","state":"11","notspeak":0,"nothear":0,"havevideo":0,"ispush":0,"type":2}]
     * cid:会话ID
     * employeeid:号码
     * naVEngine:名称
     * Queueindex:对讲排队顺序
     * state:状态见附录CallState
     * notspeak:0可讲话，1不可讲话
     * nothear:0可听，1不可听
     * havevideo:0可看视频，1不可看
     * ispush：0未推送，1被推送
     * type:号码类型见枚举消息类型
     * }
     */
    override fun notifySessionMemberChange(content: String) {
        LogUtils.i("呼叫成员状态变更notifySessionMemberChange11111111-String:$content")
    }

    /**
     * 呼叫状态变更
     *
     * @param content [{"cid":"4A2BE08A-0CF6-493A-9010-77176B6973B6","callingnum":"1006","callingnaVEngine":"1006","othernum":"10064626","othername":"TI4626","direction":"1","state":"10","type":"13","level":"9","isVideo":"1","RoadParameters":"","remark":"邀请成员","frontcid1":"A26B5A61-58A0-4705-8112-C2454B2C9A15","frontcid2":""}]
     * cid: 会话ID
     * callingnum:号码
     * CallingNaVEngine:名称
     * Othernum:对方号码
     * OthernaVEngine:对方名称
     * Direction:呼叫方向：1呼出2呼入
     * State:枚举消息类型
     * Type:枚举消息类型
     * Level:呼叫等级
     * IsVideo:是否视频呼叫
     * RoadParaVEngineters:备用参数
     * Remark:相关的操作取值有：协商转接，
     * 监听，代接，强插，强拆，转接，邀请成员
     * frontcid1：相关的前一个呼叫CID
     * frontcid2:相关的前一个呼叫的CID
     */
    override fun notifySessionStateChange(content: String) {
        LogUtils.e("呼叫状态变更notifySessionStateChange:$content")
    }

    /**
     * 通讯录组状态更新
     * 新增、修改、删除
     */
    override fun notifyDGNAUpdate() {
        LogUtils.e("通讯录组状态更新")
    }

    /**
     * 强拆信息更新
     *
     * @param cid          会话编号
     * @param caller       主叫号码
     * @param calledNumber 被叫号码
     * @param calledName   被叫名称
     * @param callType     呼叫类型
     */
    override fun notifyCallIntercept(
        cid: String,
        caller: String,
        calledNumber: String,
        calledName: String,
        callType: String
    ) {
        LogUtils.e("notifyCallIntercept-cid:$cid  caller:$caller  calledNumber:$calledNumber calledName:$calledName  callType:$callType")
    }

    override fun notifyPtzControl(i: Int, v: Double) {}

}